package com.calvin.study.controller;

import java.util.concurrent.atomic.LongAdder;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.annotation.SubscribeMapping;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.calvin.study.service.OnlineNumberCounter;
import com.calvin.study.service.WebSocketServer;

import cn.hutool.core.date.DateUtil;

@Controller
public class WebSocketController {

	@Autowired private SimpMessagingTemplate messagingTemplate;
	@Autowired private OnlineNumberCounter counter;
	
	//模拟数据定时发送
	private LongAdder c = new LongAdder();

	@RequestMapping("index")
	public String index() {
		return "index";
	}

	/**
	 * 模拟时钟
	 * 使用@Scheduled注解来定时发送消息，这里设置为每1秒发送一次
	 */
	@Scheduled(fixedRate = 1000)
	public void sendUpdates() {
		// 发送消息到/topic/updates，所有订阅了这个地址的客户端都会收到消息
		messagingTemplate.convertAndSend("/topic/updates", "This is an update at " + DateUtil.date());
	}

	/**
	 * 用于初始化数据 初次连接返回数据 只执行一次
	 * @SubscribeMapping的主要应用场景是实现请求-回应模式。
	 * 在请求-回应模式中，客户端订阅某一个目的地，然后预期在这个目的地上获得一个一次性的响应。
	 *  这种请求-回应模式与HTTP GET的请求-响应模式的关键区别在于HTTPGET请求是同步的，而订阅的请求-回应模式则是异步的，这样客户端能够在回应可用时再去处理，而不必等待。
	 **/
	@SubscribeMapping("welcome")
	public String welcome() {
		return String.valueOf(counter.onlineUsers());
	}
	
	@RequestMapping("sendMessage")
	public void sendMessage() {
		c.increment();
		messagingTemplate.convertAndSend("/topic/message", "你有一条新消息" +c.longValue());
	}
	
	/**
	 * @MessageMapping的主要应用场景是一次订阅，多次获取结果。
	 * 只要之前有订阅过，后台直接发送结果到对应的路径，则多次获取返回的结果。
	 */
    @MessageMapping("send")
    @SendTo("/topic/updates")
    public String sendToUpdates(String message) throws InterruptedException {
        // 每秒发送一次消息
        Thread.sleep(1000);
        c.increment();
        return "Update " + (c.longValue()) + ": " + message;
    }


    
    
}
